package inventario.facade;

import inventario.code.*;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @author Pedro Augusto, Rafael Ribeiro, Talita Lobo
 * 
 */
public class CadastraEditaPessoa {

	private static ArrayList<Usuario> usuariosCadastrados = new ArrayList<Usuario>();
	private static Scanner input;

	/**
	 * Metodo que captura string do teclado.
	 * 
	 * @return string formatada
	 */
	private static String recebeString() {
		limpaScan();
		return input.next().toLowerCase();
	}

	/**
	 * Metodo que compara nome passado por parametro com o nome dos usuarios ja
	 * cadastrados.
	 * 
	 * @param nome
	 *            Nome do usuario para ser comparado.
	 * @return boolean
	 */
	private static boolean contemUsuario(String nome) {
		for (Usuario usuario : usuariosCadastrados) {
			if (usuario != null && usuario.getNome().equals(nome)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo que compara login passado como parametro com o dos usuarios ja
	 * cadastrados e retorna true ou false no caso deles existirem ou nao na
	 * lista, respectivamente.
	 * 
	 * @param login
	 *            Login do usuario para ser comparado.
	 * @return boolean
	 */
	private static boolean contemLogin(String login) {
		for (Usuario usuario : usuariosCadastrados) {
			if ((!usuario.equals(null)) && usuario.getLogin().equals(login)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Metodo que limpa o receptor de strings.
	 */
	private static void limpaScan() {
		input = new Scanner(System.in);
	}

	/**
	 * Metodo que retorna uma lista de usuarios ja cadastrados.
	 * 
	 * @return ArrayList<Usuario>
	 */
	public static ArrayList<Usuario> getPessoasCadastradas() {
		return usuariosCadastrados;
	}

	/**
	 * Metodo chamado quando o administrador for cadastrar usuarios.
	 */
	public static void adminCadastraPessoa() {

		String nome = "";
		String email = "";
		String login = "";
		String senha = "";
		String nomeMaquina = "";
		TipoDeUsuario tipo = null;
		Maquina maquina = null;

		if (nome == null || nome.trim().isEmpty()) {
			System.out.print("      Informe o nome da pessoa: ");
			nome = recebeString();
			if (contemUsuario(nome)) {
				while (contemUsuario(nome)) {
					System.out
							.println("      Usuarios nao podem ter o mesmo nome.\n");
					System.out.print("      Informe o nome da pessoa: ");
					nome = recebeString();
					nome = nome.toLowerCase();
				}
			}

		}

		if (email == null || email.trim().isEmpty()) {
			System.out.print("      Informe o e-mail do usuario: ");
			email = recebeString();
			Pattern regex = Pattern.compile(".+\\@.+\\.[a-z]+");
			Matcher kaops = regex.matcher(email);
			while (!kaops.matches() == true) {
				System.out.println("\n      E-mail invalido, tente novamente.");
				System.out.print("      Informe o e-mail para o usuario: ");
				email = recebeString();
				kaops = regex.matcher(email);

			}
		}
		if (tipo == null) {
			System.out
					.print("      Escolha o tipo de usuario para ser cadastrado: "
							+ "\n      1 - GRADUANDO"
							+ "\n      2 - MESTRANDO"
							+ "\n      3 - DOUTORANDO"
							+ "\n      4 - FUNCIONARIO"
							+ "\n      5 - PROFESSOR"
							+ "\n      6 - CONVIDADO"
							+ "\n\n      Digite a opcao desejada: ");

			String opcao = recebeString();
			int tipoInt = Integer.parseInt(opcao);

			if (tipoInt == 1) {
				tipo = TipoDeUsuario.GRADUANDO;
			} else if (tipoInt == 2) {
				tipo = TipoDeUsuario.MESTRANDO;
			} else if (tipoInt == 3) {
				tipo = TipoDeUsuario.DOUTORANDO;
			} else if (tipoInt == 4) {
				tipo = TipoDeUsuario.FUNCIONARIO;
			} else if (tipoInt == 5) {
				tipo = TipoDeUsuario.PROFESSOR;
			} else if (tipoInt == 6) {
				tipo = TipoDeUsuario.CONVIDADO;
			} else {
				tipo = TipoDeUsuario.CONVIDADO;

				System.out
						.println("      Parametro invalido."
								+ "\n      Seu tipo de usuario foi definido como convidado."
								+ "\n      Seu tipo de usuario pode ser alterado mais tarde.");
			}

		}

		if (login == null || login.trim().isEmpty()) {
			System.out.print("      Informe o login para o usuario: ");
			login = recebeString();
			if (contemLogin(login)) {
				while (contemLogin(login)) {
					System.out
							.println("      Usuarios nao podem ter o mesmo login.\n");
					System.out.print("      Informe o login da pessoa: ");
					login = recebeString();
				}
			}
		}
		if (senha == null || senha.trim().isEmpty()) {
			System.out.print("      Informe a senha para o usuario: ");
			senha = recebeString();
		}
		
		System.out.println(" 	Para cadastrar maquina digite s/n(s = sim/n = nao):");
		String recebeSorN = recebeString();
		
		if (recebeSorN == "s") {
			if (nomeMaquina.trim().isEmpty() || nomeMaquina == null){
				System.out.println(" 	Digite um nome para maquina:");
				nomeMaquina = recebeString();
				try {
					CadastraEditaMaquina.cadastrMaquina(nomeMaquina);
				} catch (Exception e) {
					System.out.println("Nao foi possivel cadastrar maquina");
				}
			}
			maquina = null;
			
			
		}
		try {
			Usuario usuarioCriado = new Usuario(nome, email, tipo, login, senha, maquina);
			usuariosCadastrados.add(usuarioCriado);
		} catch (Exception e) {
			System.out
					.println("      Usuario nao pode ser cadastrado. Tente novamente.");
			adminCadastraPessoa();
		}
		System.out.println("Usuario cadastrado com sucesso!");
		System.out.print("Veja os dados cadastrados: ");

	}

	public static void adminEditaPessoa() throws Exception {

		String nome = "";
		String email = "";
		String login = "";
		String senha = "";

		String pessoaASerEditada;
		System.out
				.println("      Digite o nome do usuario para ser editado: \n");
		pessoaASerEditada = recebeString();
		pessoaASerEditada = pessoaASerEditada.toLowerCase();

		for (Usuario usuario : usuariosCadastrados) {
			if (usuario.getNome().equals(pessoaASerEditada)) {
				System.out.println("      Qual o item a ser modificado:\n"
						+ "      1 - Nome\n" + "      2 - Email\n"
						+ "      3 - Tipo\n" + "      4 - Login\n"
						+ "      5 - Senha");
				int opcao1 = Integer.parseInt(recebeString());
				if (opcao1 == 1) {
					System.out
							.print("      Informe o novo nome para a pessoa: ");
					nome = recebeString();
					nome = nome.toLowerCase();
					while (contemUsuario(nome)) {
						System.out
								.println("\n      Usuarios nao podem ter o mesmo nome.");
						System.out
								.print("      Informe o novo nome para a pessoa: ");
						nome = recebeString();

					}
					usuario.setNome(nome);
				}
				if (opcao1 == 2) {
					System.out
							.print("      Informe o novo e-mail para o usuario: ");
					email = recebeString();
					Pattern regex = Pattern.compile(".+\\@.+\\.[a-z]+");
					Matcher kaops = regex.matcher(email);
					while (!kaops.matches() == true) {
						System.out
								.println("\n      E-mail invalido, tente novamente.");
						System.out
								.print("      Informe o novo e-mail para o usuario: ");
						email = recebeString();
						kaops = regex.matcher(email);

					}
					usuario.setEmail(email);
				}
				if (opcao1 == 3) {
					System.out.print("      Informe o novo tipo do usuario: "
							+ "\n      1 - GRADUANDO" + "\n      2 - MESTRANDO"
							+ "\n      3 - DOUTORANDO"
							+ "\n      4 - FUNCIONARIO"
							+ "\n      5 - PROFESSOR" + "\n      6 - CONVIDADO"
							+ "\n\n      Digite a opcao desejada: ");

					String opcao = recebeString();
					int tipoInt = Integer.parseInt(opcao);

					if (tipoInt == 1) {
						usuario.setTipoDeUsuario(TipoDeUsuario.GRADUANDO);
					} else if (tipoInt == 2) {
						usuario.setTipoDeUsuario(TipoDeUsuario.MESTRANDO);
					} else if (tipoInt == 3) {
						usuario.setTipoDeUsuario(TipoDeUsuario.DOUTORANDO);
					} else if (tipoInt == 4) {
						usuario.setTipoDeUsuario(TipoDeUsuario.FUNCIONARIO);
					} else if (tipoInt == 5) {
						usuario.setTipoDeUsuario(TipoDeUsuario.PROFESSOR);
					} else if (tipoInt == 6) {
						usuario.setTipoDeUsuario(TipoDeUsuario.CONVIDADO);
					} else {
						usuario.setTipoDeUsuario(TipoDeUsuario.CONVIDADO);

						System.out
								.println("      Parametro invalido."
										+ "\n      Seu tipo de usuario foi alterado para convidado."
										+ "\n      Seu tipo de usuario pode ser alterado novamente mais tarde.");
					}
				}
				if (opcao1 == 4) {
					System.out
							.print("      Informe o novo login para o usuario: ");
					login = recebeString();
					if (contemLogin(login)) {
						while (contemLogin(login)) {
							System.out
									.println("      Usuarios nao podem ter o mesmo login.\n");
							System.out
									.print("      Informe o login da pessoa: ");
							login = recebeString();
							login = nome.toLowerCase();
						}
					}
					usuario.setLogin(login);
				}
				if (opcao1 == 5) {
					System.out
							.print("      Informe a nova senha para o usuario: ");
					senha = recebeString();
					usuario.setSenha(senha);
				}
			}
		}

	}

	/**
	 * Metodo chamado pelo usuario logado para que ele possa editar suas
	 * informacoes.
	 * 
	 * @param usuarioCorrente
	 *            Usuario que esta logado no momento.
	 */
	public static void usuarioEditaPessoa(Usuario usuarioCorrente) {

		String nome, email;

		System.out.println("      Qual o item a ser modificado:\n"
				+ "      1 - Nome\n" + "      2 - E-mail\n");
		int opcao = Integer.parseInt(recebeString());
		if (opcao == 1) {
			System.out.print("      Informe o novo nome do usuario: ");
			nome = recebeString();
			nome = nome.toLowerCase();
			if (contemUsuario(nome)) {
				while (contemUsuario(nome)) {
					System.out
							.println("      Usuarios nao podem ter o mesmo nome.\n");
					System.out.print("      Informe o nome da pessoa: ");
					nome = recebeString();
					nome = nome.toLowerCase();
				}
			}
			usuarioCorrente.setNome(nome);
		}
		if (opcao == 2) {
			System.out.print("      Informe o novo e-mail para o usuario: ");
			email = recebeString();
			Pattern regex = Pattern.compile(".+\\@.+\\.[a-z]+");
			Matcher kaops = regex.matcher(email);
			while (!kaops.matches()) {
				System.out.println("\n      E-mail invalido, tente novamente.");
				System.out
						.print("      Informe o novo e-mail para o usuario: ");
				email = recebeString();
				kaops = regex.matcher(email);

			}
			usuarioCorrente.setEmail(email);
		}
	}

	/**
	 * Metodo que remove usuario da lista.
	 */
	public static void removeUsuario() {

		String nomeASerRemovido;
		System.out
				.println("      Digite o nome do usuario para ser removido: \n");
		nomeASerRemovido = recebeString();
		nomeASerRemovido = nomeASerRemovido.toLowerCase();

		for (Usuario usuario : usuariosCadastrados) {
			if (usuario.getNome().equals(nomeASerRemovido)) {
				usuariosCadastrados.remove(usuario);
				break;
			}
			System.out.println("      O usuario nao pode ser removido.");
		}

	}

	public static void s(String[] args) throws Exception {

		adminCadastraPessoa();
		System.out.println("\n" + usuariosCadastrados.get(0).toString());
		System.out.println();

		removeUsuario();

	}

}
